home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / GraphicViewers / pCD / Source / hpcdtoppm.0.4 / color.c < prev    next >
C/C++ Source or Header  |  1993-03-23  |  4KB  |  237 lines

  1. /* hpcdtoppm (Hadmut's pcdtoppm) v0.4
  2. *  Copyright (c) 1992, 1993 by Hadmut Danisch (danisch@ira.uka.de).
  3. *  Permission to use and distribute this software and its
  4. *  documentation for noncommercial use and without fee is hereby granted,
  5. *  provided that the above copyright notice appear in all copies and that
  6. *  both that copyright notice and this permission notice appear in
  7. *  supporting documentation. It is not allowed to sell this software in 
  8. *  any way. This software is not public domain.
  9. */
  10.  
  11. #include "hpcdtoppm.h"
  12.  
  13. extern int RGB_BitSh1,RGB_Maximum1;
  14. extern int RGB_F_LL;
  15. extern int RGB_F_C1,RGB_O_C1;
  16. extern int RGB_F_C2,RGB_O_C2;
  17. extern int RGB_F_G1,RGB_F_G2,RGB_O_G;
  18. extern uBYTE RGB_corr0[],RGB_corr1[],RGB_corr2[];
  19.  
  20.  
  21.  
  22.  
  23. static uBYTE *RGB_corr=0;
  24. static void ycctorgb();
  25. static void monocorr();
  26.  
  27.  
  28. static void initcorr()
  29.  { 
  30.   switch(corrmode)
  31.    {case C_LINEAR: RGB_corr=RGB_corr0; break;
  32.     case C_DARK:   RGB_corr=RGB_corr1; break;
  33.     case C_BRIGHT: RGB_corr=RGB_corr2; break;
  34.     default: error(E_INTERN);
  35.    }
  36.  }
  37.  
  38. void colconvert(wp,hp,l,c1,c2)
  39.   dim *wp,*hp;
  40.   implane *l,*c1,*c2;
  41. #define w (*wp)
  42. #define h (*hp)
  43.  
  44.  {
  45.   melde("colconvert\n");
  46.  
  47.     if((!l ) || ( l->iwidth != w ) || ( l->iheight != h) || (! l->im)) error(E_INTERN);
  48.  
  49.   if(!monochrome)
  50.    {
  51.     if((!c1) || (c1->iwidth != w ) || (c1->iheight != h) || (!c1->im)) error(E_INTERN);
  52.     if((!c2) || (c2->iwidth != w ) || (c2->iheight != h) || (!c2->im)) error(E_INTERN);
  53.    }
  54.  
  55.   if (do_crop)  cropit(wp,hp,l,c1,c2);
  56.  
  57.   if (do_sharp) sharpit(l);
  58.  
  59.   switch (outfor)
  60.    {
  61.     case O_PS:
  62.     case O_EPS:
  63.     case O_PPM: ycctorgb(w,h,l,c1,c2);
  64.                 break;
  65.  
  66.     case O_PSG:
  67.     case O_EPSG:
  68.     case O_PGM: monocorr(w,h,l);
  69.                 break;
  70.     case O_YCC:
  71.                 break;
  72.     default: error(E_INTERN);
  73.    }
  74. #undef w
  75. #undef h
  76.  }
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84. static long T_L[256],T_R[256],T_G[256],T_g[256],T_B[256];
  85.  
  86.  
  87. static void initctable()
  88.  {long i;
  89.   static int init=0;
  90.  
  91.   if(init) return;
  92.  
  93.   init=1;
  94.  
  95.   initcorr();
  96.  
  97.   for(i=0;i<256;i++)
  98.    {  T_L[i] = i * RGB_F_LL;
  99.       T_R[i] = i * RGB_F_C2 + RGB_O_C2;
  100.       T_G[i] = i * RGB_F_G1;
  101.       T_g[i] = i * RGB_F_G2 + RGB_O_G;
  102.       T_B[i] = i * RGB_F_C1 + RGB_O_C1;      
  103.    }
  104.   
  105.  }
  106.  
  107.  
  108. static void ycctorgb(w,h,l,c1,c2)
  109.   dim w,h;
  110.   implane *l,*c1,*c2;
  111.  {dim x,y;
  112.   uBYTE *pl,*pc1,*pc2;
  113.   long red,green,blue;
  114.   long L;
  115.  
  116.   melde("ycctorgb\n");
  117.   initctable();
  118.  
  119.   for(y=0;y<h;y++)
  120.    {
  121.     pl =  l->im + y *  l->mwidth;
  122.     pc1= c1->im + y * c1->mwidth;
  123.     pc2= c2->im + y * c2->mwidth;
  124.  
  125.     for(x=0;x<w;x++)
  126.      {
  127.       L    =  T_L[*pl]; 
  128.       red  = (L + T_R[*pc2]             )>>RGB_BitSh1;
  129.       green= (L + T_G[*pc1] + T_g[*pc2] )>>RGB_BitSh1; 
  130.       blue = (L + T_B[*pc1]             )>>RGB_BitSh1;
  131.  
  132.       red   = TRIF(red,  0,RGB_Maximum1,0,red,  RGB_Maximum1);
  133.       green = TRIF(green,0,RGB_Maximum1,0,green,RGB_Maximum1);
  134.       blue  = TRIF(blue ,0,RGB_Maximum1,0,blue, RGB_Maximum1);
  135.  
  136.       *(pl++ )=RGB_corr[red]; 
  137.       *(pc1++)=RGB_corr[green]; 
  138.       *(pc2++)=RGB_corr[blue];
  139.      }
  140.    }
  141.  }
  142. #undef BitShift
  143.  
  144. #define slen 3072
  145.  
  146. void sharpit(l)
  147.   implane *l;
  148.  {int x,y,h,w,mw,akk;
  149.   uBYTE f1[slen],f2[slen],*old,*akt,*ptr,*work,*help,*optr=0;
  150.  
  151.   melde("sharpit\n");
  152.  
  153.   if((!l) || (!l->im)) error(E_INTERN);
  154.   if(l->iwidth > slen) error(E_INTERN);
  155.  
  156.   old=f1; akt=f2;
  157.   h=l->iheight;
  158.   w=l->iwidth;
  159.   mw=l->mwidth;
  160.  
  161.   for(y=1;y<h-1;y++)
  162.    {
  163.     ptr=l->im+ y*mw;
  164.     optr=ptr-mw;
  165.     work=akt;
  166.  
  167.     *(work++)= *(ptr++);
  168.     for(x=1;x<w-1;x++)
  169.      {  akk = 5*((int)ptr[0])- ((int)ptr[1])  - ((int)ptr[-1]) 
  170.                               - ((int)ptr[mw]) - ((int)ptr[-mw]);
  171.         NORM(akk);
  172.         *(work++)=akk;
  173.         ptr++;
  174.      }
  175.  
  176.     *(work++)= *(ptr++);
  177.  
  178.     if(y>1) 
  179.       for(x=0;x<w;x++)
  180.         optr[x] = old[x];
  181.  
  182.     help=old;old=akt;akt=help;
  183.      
  184.    }
  185.  
  186.  
  187.  
  188.   akt=optr+mw;
  189.   for(x=0;x<w;x++)
  190.     *(akt++) = *(old++);
  191.  }
  192.  
  193.  
  194. #undef slen
  195.  
  196. #include <math.h>
  197. #define hoch(a,b) (exp((b)*log(a)))
  198.  
  199.  
  200.  
  201. static void initmtable()
  202.  {long i,h;
  203.   static int init=0;
  204.  
  205.   if(init) return;
  206.  
  207.   init=1;
  208.  
  209.   initcorr();
  210.  
  211.   for(i=0;i<256;i++)
  212.    {  h = (i * RGB_F_LL)>>RGB_BitSh1;
  213.       h = TRIF(h,0,RGB_Maximum1,0,h,RGB_Maximum1);
  214.       T_L[i]=RGB_corr[h];
  215.    }
  216.   
  217.  }
  218.  
  219.  
  220. static void monocorr(w,h,l)
  221.   dim w,h;
  222.   implane *l;
  223.  {dim x,y;
  224.   uBYTE *ptr;
  225.  
  226.   melde("monocorr\n");
  227.   initmtable();
  228.  
  229.   for(y=0;y<h;y++)
  230.    {
  231.     ptr=  l->im + y *  l->mwidth;
  232.     for(x=0;x<w;x++,ptr++)
  233.      { *ptr = T_L[*ptr]; 
  234.      }
  235.    }
  236.  }
  237.